import datetime
import functools

import jwt

from common.message import MesCode
from config import logger, BasicConfig

"""
函数也是对象,可以赋值给变量去调用,对象有自己的__name__
__name__ 是一个特殊的内置属性，用来表示模块或函数的名称
@functools.wraps(func)的目的是,使得保留原函数的元数据（如名称、文档字符串、参数签名等
wrapper 函数的参数是由外部函数（即装饰器本身）传递给它的，它通常需要接受原始函数（被装饰函数）传递的所有参数。
为了确保 wrapper 函数能够处理不同数量和类型的参数（例如位置参数和关键字参数），通常会使用 *args 和 **kwargs。
"""


def login_required(role='user'):
    def inner(func):
        @functools.wraps(func)
        async def wrapper(self, *args, **kwargs):
            # 这个内层函数接受原始函数的参数，并通过包装或修改这些参数来增强原始函数的行为。
            user = await self.user
            if role == 'user':
                return await func(self, *args, **kwargs)
            if user['role'] == role:
                return await func(self, *args, **kwargs)
            self.send_response(MesCode.fail, None, '无权限')

        return wrapper

    return inner


def time(func):
    @functools.wraps(func)
    async def wrapper(*args, **kwargs):
        time_start = datetime.datetime.now()
        res = await func(*args, **kwargs)
        time_end = datetime.datetime.now()
        time_diff = time_end - time_start
        time_diff = time_diff.total_seconds()
        logger.info(f'{func.__name__} spend seconds: {time_diff}')
        return res

    return wrapper
